<template>
  <!-- 做到setup中返回的dropdownRef和这里的ref完全一样就可以通过dropdownRef.value拿到dom节点 -->
  <div class="dropdown" ref="dropdownRef">
    <a href="#" class="btn btn-outline-light my-2 dropdown-toggle">
      {{ title }}
    </a>
    <ul class="dropdown-menu" aria-labelledby="dropdownMenuButton1" :style="{ display: 'block', minWidth: '108px' }"
      v-if="isOpen">
      <slot></slot>
    </ul>
  </div>
</template>

<script lang="ts">
import { ref, defineComponent, watch } from "vue";
import useClickOutside from "../hooks/useClickOutside";

export default defineComponent({
  name: "Dropdown",
  props: {
    title: {
      type: String,
      require: true
    },
    isOpen: {
      type: Boolean,
      require: true
    }
  },
  setup(props, content) {
    // const isOpen =
    // 添加：dropdownRef是一个联合泛型 在setup中还不是dom节点类型，dom真正挂载之后才是
    const dropdownRef = ref<null | HTMLElement>(null);

    const isClickOutside = useClickOutside(dropdownRef);

    // setup中的函数只能执行一次所以要用watch来监测变化
    watch(isClickOutside, () => {
      // 监视的逻辑
      if (props.isOpen && isClickOutside) {
        // props.isOpen = false;
        // 发送上传事件
        content.emit("update:isOpen", false);
      }
    });
    /*// 添加click点击事件的回调函数
        const handler = (e: MouseEvent)=>{
            // dropdownRef.value可以拿到<div class="dropdown" ref="dropdownRef"> dom节点
            if(dropdownRef.value){
                // 两个判断条件
                // 1. dropdownRef节点是否包含e.target点击事件的触发元素 使用node.contains(otherNode),不一定所有的e.target都是HTMLElement所以可以类型断言一下
                // 2. 是否打开着dropdown下拉列表 isOpen来判断
                if(!dropdownRef.value.contains(e.target as HTMLElement) && isOpen.value){
                    isOpen.value = false;
                }
                
            }
        }
        // 事件监听器需要在mounted的时候添加，在unmounted的时候删除
        onMounted(()=>{
            document.addEventListener('click',handler)
        })
        onUnmounted(()=>{
            document.removeEventListener('click',handler)
        })*/

    return {
      // isOpen,
      // toggleOpen,
      dropdownRef
    };
  }
});
</script>

<style lang="less" scoped>

</style>
